package main

import (
	"encoding/json"
	"fmt"
)

type Order struct {
	//后面的标签指定序列化和反序列化时的 key 名
	Name  string `json:"name"`
	Price int    `json:"price"`
	Num   int    `json:"num"`
}

//结构体序列护和反序列化
func jsonStruct() {
	order := Order{
		"洗发水",
		55.0,
		2,
	}
	bytes, err := json.Marshal(order)
	if checkError(err) {
		return
	}
	//序列化后的结果: {"name":"洗发水","price":55,"num":2}
	fmt.Println("序列化后的结果:", string(bytes))

	var orderRes Order
	err = json.Unmarshal(bytes, &orderRes)
	if jsonError(err) {
		return
	}
	//反序列化的结果: {洗发水 55 2}
	fmt.Println("反序列化的结果:", orderRes)

}

//切片以及 map 的序列化和反序列化的形式
func jsonSliceAndMap() {
	var sliceMap []map[string]interface{}
	m1 := make(map[string]interface{})
	m1["name"] = "洗发水"

	m2 := make(map[string]interface{})
	m2["price"] = 2.2

	sliceMap = append(sliceMap, m1)
	sliceMap = append(sliceMap, m2)

	jsonBytes, err := json.Marshal(sliceMap)
	if checkError(err) {
		return
	}
	//序列化后的结果: [{"name":"洗发水"},{"price":2.2}]
	fmt.Println("序列化后的结果:", string(jsonBytes))
	var res []map[string]interface{}
	err = json.Unmarshal(jsonBytes, &res)
	if jsonError(err) {
		return
	}
	//反序列化的结果: [map[name:洗发水] map[price:2.2]]
	fmt.Println("反序列化的结果:", res)
}

func checkError(err error) bool {
	if err != nil {
		fmt.Println("序列化结构体出错:", err)
		return true
	}
	return false
}
func jsonError(err error) bool {
	if err != nil {
		fmt.Println("反序列化出错:", err)
		return true
	}
	return false
}
func main() {
	jsonStruct()
	jsonSliceAndMap()
}
